home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / swingall.jar / javax / swing / text / html / ImageView.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-07-15  |  13.1 KB  |  611 lines

  1. package javax.swing.text.html;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.Container;
  6. import java.awt.Dimension;
  7. import java.awt.Graphics;
  8. import java.awt.Image;
  9. import java.awt.Point;
  10. import java.awt.Rectangle;
  11. import java.awt.Shape;
  12. import java.awt.Toolkit;
  13. import java.awt.event.InputEvent;
  14. import java.awt.event.MouseEvent;
  15. import java.awt.event.MouseListener;
  16. import java.awt.event.MouseMotionListener;
  17. import java.awt.image.ImageObserver;
  18. import java.io.BufferedInputStream;
  19. import java.io.ByteArrayOutputStream;
  20. import java.io.FilterInputStream;
  21. import java.io.IOException;
  22. import java.io.InputStream;
  23. import java.io.OutputStream;
  24. import java.net.MalformedURLException;
  25. import java.net.URL;
  26. import java.util.Dictionary;
  27. import javax.swing.Icon;
  28. import javax.swing.ImageIcon;
  29. import javax.swing.JEditorPane;
  30. import javax.swing.event.DocumentEvent;
  31. import javax.swing.text.AbstractDocument;
  32. import javax.swing.text.AttributeSet;
  33. import javax.swing.text.BadLocationException;
  34. import javax.swing.text.Document;
  35. import javax.swing.text.Element;
  36. import javax.swing.text.JTextComponent;
  37. import javax.swing.text.Position;
  38. import javax.swing.text.SimpleAttributeSet;
  39. import javax.swing.text.StyledDocument;
  40. import javax.swing.text.View;
  41. import javax.swing.text.ViewFactory;
  42. import javax.swing.text.Position.Bias;
  43. import javax.swing.text.html.HTML.Attribute;
  44. import javax.swing.text.html.HTML.Tag;
  45.  
  46. class ImageView extends View implements ImageObserver, MouseListener, MouseMotionListener {
  47.    public static final String TOP = "top";
  48.    public static final String TEXTTOP = "texttop";
  49.    public static final String MIDDLE = "middle";
  50.    public static final String ABSMIDDLE = "absmiddle";
  51.    public static final String CENTER = "center";
  52.    public static final String BOTTOM = "bottom";
  53.    private static boolean sIsInc = true;
  54.    private static int sIncRate = 100;
  55.    private AttributeSet attr;
  56.    private Element fElement;
  57.    private Image fImage;
  58.    private int fHeight;
  59.    private int fWidth;
  60.    private Container fContainer;
  61.    private Rectangle fBounds;
  62.    private Component fComponent;
  63.    private Point fGrowBase;
  64.    private boolean fGrowProportionally;
  65.    private boolean loading;
  66.    private static Icon sPendingImageIcon;
  67.    private static Icon sMissingImageIcon;
  68.    private static final String PENDING_IMAGE_SRC = "icons/image-delayed.gif";
  69.    private static final String MISSING_IMAGE_SRC = "icons/image-failed.gif";
  70.    private static final boolean DEBUG = false;
  71.    static final String IMAGE_CACHE_PROPERTY = "imageCache";
  72.    private static final int DEFAULT_WIDTH = 32;
  73.    private static final int DEFAULT_HEIGHT = 32;
  74.    private static final int DEFAULT_BORDER = 2;
  75.    // $FF: synthetic field
  76.    static Class class$javax$swing$text$html$ImageView;
  77.  
  78.    public ImageView(Element var1) {
  79.       super(var1);
  80.       this.initialize(var1);
  81.       StyleSheet var2 = this.getStyleSheet();
  82.       this.attr = var2.getViewAttributes(this);
  83.    }
  84.  
  85.    public void changedUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  86.       super.changedUpdate(var1, var2, var3);
  87.       float var4 = this.getVerticalAlignment();
  88.       int var5 = this.fHeight;
  89.       int var6 = this.fWidth;
  90.       this.initialize(((View)this).getElement());
  91.       boolean var7 = this.fHeight != var5;
  92.       boolean var8 = this.fWidth != var6;
  93.       if (var7 || var8 || this.getVerticalAlignment() != var4) {
  94.          ((View)this).getParent().preferenceChanged(this, var7, var8);
  95.       }
  96.  
  97.    }
  98.  
  99.    // $FF: synthetic method
  100.    static Class class$(String var0) {
  101.       try {
  102.          return Class.forName(var0);
  103.       } catch (ClassNotFoundException var2) {
  104.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  105.       }
  106.    }
  107.  
  108.    public float getAlignment(int var1) {
  109.       switch (var1) {
  110.          case 1:
  111.             return this.getVerticalAlignment();
  112.          default:
  113.             return super.getAlignment(var1);
  114.       }
  115.    }
  116.  
  117.    public AttributeSet getAttributes() {
  118.       return this.attr;
  119.    }
  120.  
  121.    int getBorder() {
  122.       return this.getIntAttr(Attribute.BORDER, this.isLink() ? 2 : 0);
  123.    }
  124.  
  125.    Color getBorderColor() {
  126.       StyledDocument var1 = (StyledDocument)((View)this).getDocument();
  127.       return var1.getForeground(this.getAttributes());
  128.    }
  129.  
  130.    protected Color getHighlightColor() {
  131.       JTextComponent var1 = (JTextComponent)this.fContainer;
  132.       return var1.getSelectionColor();
  133.    }
  134.  
  135.    private int getIntAttr(HTML.Attribute var1, int var2) {
  136.       AttributeSet var3 = this.fElement.getAttributes();
  137.       if (var3.isDefined(var1)) {
  138.          String var5 = (String)var3.getAttribute(var1);
  139.          int var4;
  140.          if (var5 == null) {
  141.             var4 = var2;
  142.          } else {
  143.             try {
  144.                var4 = Math.max(0, Integer.parseInt(var5));
  145.             } catch (NumberFormatException var6) {
  146.                var4 = var2;
  147.             }
  148.          }
  149.  
  150.          return var4;
  151.       } else {
  152.          return var2;
  153.       }
  154.    }
  155.  
  156.    public float getPreferredSpan(int var1) {
  157.       int var2 = 2 * (this.getBorder() + this.getSpace(var1));
  158.       switch (var1) {
  159.          case 0:
  160.             return (float)(this.fWidth + var2);
  161.          case 1:
  162.             return (float)(this.fHeight + var2);
  163.          default:
  164.             throw new IllegalArgumentException("Invalid axis: " + var1);
  165.       }
  166.    }
  167.  
  168.    protected int getSelectionState() {
  169.       int var1 = this.fElement.getStartOffset();
  170.       int var2 = this.fElement.getEndOffset();
  171.       if (this.fContainer instanceof JTextComponent) {
  172.          JTextComponent var3 = (JTextComponent)this.fContainer;
  173.          int var4 = var3.getSelectionStart();
  174.          int var5 = var3.getSelectionEnd();
  175.          if (var4 <= var1 && var5 >= var2) {
  176.             if (var4 == var1 && var5 == var2 && this.isEditable()) {
  177.                return 2;
  178.             }
  179.  
  180.             return 1;
  181.          }
  182.       }
  183.  
  184.       return 0;
  185.    }
  186.  
  187.    private URL getSourceURL() {
  188.       String var1 = (String)this.fElement.getAttributes().getAttribute(Attribute.SRC);
  189.       if (var1 == null) {
  190.          return null;
  191.       } else {
  192.          URL var2 = ((HTMLDocument)((View)this).getDocument()).getBase();
  193.  
  194.          try {
  195.             URL var3 = new URL(var2, var1);
  196.             return var3;
  197.          } catch (MalformedURLException var4) {
  198.             return null;
  199.          }
  200.       }
  201.    }
  202.  
  203.    int getSpace(int var1) {
  204.       return this.getIntAttr(var1 == 0 ? Attribute.HSPACE : Attribute.VSPACE, 0);
  205.    }
  206.  
  207.    protected StyleSheet getStyleSheet() {
  208.       HTMLDocument var1 = (HTMLDocument)((View)this).getDocument();
  209.       return var1.getStyleSheet();
  210.    }
  211.  
  212.    float getVerticalAlignment() {
  213.       String var1 = (String)this.fElement.getAttributes().getAttribute(Attribute.ALIGN);
  214.       if (var1 != null) {
  215.          var1 = var1.toLowerCase();
  216.          if (var1.equals("top") || var1.equals("texttop")) {
  217.             return 0.0F;
  218.          }
  219.  
  220.          if (var1.equals("center") || var1.equals("middle") || var1.equals("absmiddle")) {
  221.             return 0.5F;
  222.          }
  223.       }
  224.  
  225.       return 1.0F;
  226.    }
  227.  
  228.    boolean hasPixels(ImageObserver var1) {
  229.       return this.fImage != null && this.fImage.getHeight(var1) > 0 && this.fImage.getWidth(var1) > 0;
  230.    }
  231.  
  232.    public boolean imageUpdate(Image var1, int var2, int var3, int var4, int var5, int var6) {
  233.       if (this.fImage != null && this.fImage == var1) {
  234.          if ((var2 & 192) != 0) {
  235.             this.fImage = null;
  236.             this.repaint(0L);
  237.             return false;
  238.          } else {
  239.             short var7 = 0;
  240.             if ((var2 & 2) != 0 && !((View)this).getElement().getAttributes().isDefined(Attribute.HEIGHT)) {
  241.                var7 = (short)(var7 | 1);
  242.             }
  243.  
  244.             if ((var2 & 1) != 0 && !((View)this).getElement().getAttributes().isDefined(Attribute.WIDTH)) {
  245.                var7 = (short)(var7 | 2);
  246.             }
  247.  
  248.             synchronized(this){}
  249.  
  250.             try {
  251.                if ((var7 & 1) == 1) {
  252.                   this.fWidth = var5;
  253.                }
  254.  
  255.                if ((var7 & 2) == 2) {
  256.                   this.fHeight = var6;
  257.                }
  258.  
  259.                if (this.loading) {
  260.                   boolean var17 = true;
  261.                   return var17;
  262.                }
  263.             } catch (Throwable var16) {
  264.                throw var16;
  265.             }
  266.  
  267.             if (var7 != 0) {
  268.                Document var8 = ((View)this).getDocument();
  269.  
  270.                try {
  271.                   if (var8 instanceof AbstractDocument) {
  272.                      ((AbstractDocument)var8).readLock();
  273.                   }
  274.  
  275.                   ((View)this).preferenceChanged(this, true, true);
  276.                } finally {
  277.                   if (var8 instanceof AbstractDocument) {
  278.                      ((AbstractDocument)var8).readUnlock();
  279.                   }
  280.  
  281.                }
  282.  
  283.                return true;
  284.             } else {
  285.                if ((var2 & 48) != 0) {
  286.                   this.repaint(0L);
  287.                } else if ((var2 & 8) != 0 && sIsInc) {
  288.                   this.repaint((long)sIncRate);
  289.                }
  290.  
  291.                return (var2 & 32) == 0;
  292.             }
  293.          }
  294.       } else {
  295.          return false;
  296.       }
  297.    }
  298.  
  299.    private void initialize(Element var1) {
  300.       synchronized(this){}
  301.  
  302.       try {
  303.          this.loading = true;
  304.          this.fWidth = this.fHeight = 0;
  305.       } catch (Throwable var26) {
  306.          throw var26;
  307.       }
  308.  
  309.       int var2 = 0;
  310.       int var3 = 0;
  311.       boolean var4 = false;
  312.       boolean var5 = false;
  313.  
  314.       try {
  315.          this.fElement = var1;
  316.          AttributeSet var8 = var1.getAttributes();
  317.          URL var9 = this.getSourceURL();
  318.          if (var9 != null) {
  319.             Dictionary var10 = (Dictionary)((View)this).getDocument().getProperty("imageCache");
  320.             if (var10 != null) {
  321.                this.fImage = (Image)var10.get(var9);
  322.             } else {
  323.                this.fImage = Toolkit.getDefaultToolkit().getImage(var9);
  324.             }
  325.          }
  326.  
  327.          var3 = this.getIntAttr(Attribute.HEIGHT, -1);
  328.          var5 = var3 > 0;
  329.          if (!var5 && this.fImage != null) {
  330.             var3 = this.fImage.getHeight(this);
  331.          }
  332.  
  333.          if (var3 <= 0) {
  334.             var3 = 32;
  335.          }
  336.  
  337.          var2 = this.getIntAttr(Attribute.WIDTH, -1);
  338.          var4 = var2 > 0;
  339.          if (!var4 && this.fImage != null) {
  340.             var2 = this.fImage.getWidth(this);
  341.          }
  342.  
  343.          if (var2 <= 0) {
  344.             var2 = 32;
  345.          }
  346.  
  347.          if (this.fImage != null) {
  348.             if (var4 && var5) {
  349.                Toolkit.getDefaultToolkit().prepareImage(this.fImage, var3, var2, this);
  350.             } else {
  351.                Toolkit.getDefaultToolkit().prepareImage(this.fImage, -1, -1, this);
  352.             }
  353.          }
  354.       } finally {
  355.          synchronized(this){}
  356.  
  357.          try {
  358.             this.loading = false;
  359.             if (var4 || this.fWidth == 0) {
  360.                this.fWidth = var2;
  361.             }
  362.  
  363.             if (var5 || this.fHeight == 0) {
  364.                this.fHeight = var3;
  365.             }
  366.          } catch (Throwable var27) {
  367.             throw var27;
  368.          }
  369.  
  370.       }
  371.  
  372.    }
  373.  
  374.    protected boolean isEditable() {
  375.       return this.fContainer instanceof JEditorPane && ((JEditorPane)this.fContainer).isEditable();
  376.    }
  377.  
  378.    boolean isLink() {
  379.       AttributeSet var1 = (AttributeSet)this.fElement.getAttributes().getAttribute(Tag.A);
  380.       return var1 != null ? var1.isDefined(Attribute.HREF) : false;
  381.    }
  382.  
  383.    private void loadIcons() {
  384.       try {
  385.          if (sPendingImageIcon == null) {
  386.             sPendingImageIcon = this.makeIcon("icons/image-delayed.gif");
  387.          }
  388.  
  389.          if (sMissingImageIcon == null) {
  390.             sMissingImageIcon = this.makeIcon("icons/image-failed.gif");
  391.          }
  392.       } catch (Exception var1) {
  393.          System.err.println("ImageView: Couldn't load image icons");
  394.       }
  395.  
  396.    }
  397.  
  398.    private Icon makeIcon(String var1) throws IOException {
  399.       InputStream var2 = HTMLEditorKit.getResourceAsStream(var1);
  400.       if (var2 == null) {
  401.          System.err.println((class$javax$swing$text$html$ImageView != null ? class$javax$swing$text$html$ImageView : (class$javax$swing$text$html$ImageView = class$("javax.swing.text.html.ImageView"))).getName() + "/" + var1 + " not found.");
  402.          return null;
  403.       } else {
  404.          BufferedInputStream var3 = new BufferedInputStream(var2);
  405.          ByteArrayOutputStream var4 = new ByteArrayOutputStream(1024);
  406.          byte[] var5 = new byte[1024];
  407.  
  408.          int var6;
  409.          while((var6 = ((FilterInputStream)var3).read(var5)) > 0) {
  410.             var4.write(var5, 0, var6);
  411.          }
  412.  
  413.          ((FilterInputStream)var3).close();
  414.          ((OutputStream)var4).flush();
  415.          var5 = var4.toByteArray();
  416.          if (var5.length == 0) {
  417.             System.err.println("warning: " + var1 + " is zero-length");
  418.             return null;
  419.          } else {
  420.             return new ImageIcon(var5);
  421.          }
  422.       }
  423.    }
  424.  
  425.    public Shape modelToView(int var1, Shape var2, Position.Bias var3) throws BadLocationException {
  426.       int var4 = ((View)this).getStartOffset();
  427.       int var5 = ((View)this).getEndOffset();
  428.       if (var1 >= var4 && var1 <= var5) {
  429.          Rectangle var6 = var2.getBounds();
  430.          if (var1 == var5) {
  431.             var6.x += var6.width;
  432.          }
  433.  
  434.          var6.width = 0;
  435.          return var6;
  436.       } else {
  437.          return null;
  438.       }
  439.    }
  440.  
  441.    public void mouseClicked(MouseEvent var1) {
  442.       var1.getClickCount();
  443.    }
  444.  
  445.    public void mouseDragged(MouseEvent var1) {
  446.       if (this.fGrowBase != null) {
  447.          Point var2 = this.fComponent.getLocationOnScreen();
  448.          int var3 = Math.max(2, var2.x + var1.getX() - this.fGrowBase.x);
  449.          int var4 = Math.max(2, var2.y + var1.getY() - this.fGrowBase.y);
  450.          if (((InputEvent)var1).isShiftDown() && this.fImage != null) {
  451.             float var5 = (float)this.fImage.getWidth(this);
  452.             float var6 = (float)this.fImage.getHeight(this);
  453.             if (var5 > 0.0F && var6 > 0.0F) {
  454.                float var7 = var6 / var5;
  455.                float var8 = (float)var4 / var7;
  456.                float var9 = (float)var3 * var7;
  457.                if (var8 > (float)var3) {
  458.                   var3 = (int)var8;
  459.                } else {
  460.                   var4 = (int)var9;
  461.                }
  462.             }
  463.          }
  464.  
  465.          this.resize(var3, var4);
  466.       }
  467.  
  468.    }
  469.  
  470.    public void mouseEntered(MouseEvent var1) {
  471.    }
  472.  
  473.    public void mouseExited(MouseEvent var1) {
  474.    }
  475.  
  476.    public void mouseMoved(MouseEvent var1) {
  477.    }
  478.  
  479.    public void mousePressed(MouseEvent var1) {
  480.       Dimension var2 = this.fComponent.getSize();
  481.       if (var1.getX() >= var2.width - 7 && var1.getY() >= var2.height - 7 && this.getSelectionState() == 2) {
  482.          Point var8 = this.fComponent.getLocationOnScreen();
  483.          this.fGrowBase = new Point(var8.x + var1.getX() - this.fWidth, var8.y + var1.getY() - this.fHeight);
  484.          this.fGrowProportionally = ((InputEvent)var1).isShiftDown();
  485.       } else {
  486.          this.fGrowBase = null;
  487.          JTextComponent var3 = (JTextComponent)this.fContainer;
  488.          int var4 = this.fElement.getStartOffset();
  489.          int var5 = this.fElement.getEndOffset();
  490.          int var6 = var3.getCaret().getMark();
  491.          int var7 = var3.getCaret().getDot();
  492.          if (((InputEvent)var1).isShiftDown()) {
  493.             if (var6 <= var4) {
  494.                var3.moveCaretPosition(var5);
  495.             } else {
  496.                var3.moveCaretPosition(var4);
  497.             }
  498.          } else {
  499.             if (var6 != var4) {
  500.                var3.setCaretPosition(var4);
  501.             }
  502.  
  503.             if (var7 != var5) {
  504.                var3.moveCaretPosition(var5);
  505.             }
  506.          }
  507.       }
  508.  
  509.    }
  510.  
  511.    public void mouseReleased(MouseEvent var1) {
  512.       this.fGrowBase = null;
  513.    }
  514.  
  515.    public void paint(Graphics var1, Shape var2) {
  516.       Color var3 = var1.getColor();
  517.       this.fBounds = var2.getBounds();
  518.       int var4 = this.getBorder();
  519.       int var5 = this.fBounds.x + var4 + this.getSpace(0);
  520.       int var6 = this.fBounds.y + var4 + this.getSpace(1);
  521.       int var7 = this.fWidth;
  522.       int var8 = this.fHeight;
  523.       int var9 = this.getSelectionState();
  524.       if (!this.hasPixels(this)) {
  525.          var1.setColor(Color.lightGray);
  526.          var1.drawRect(var5, var6, var7 - 1, var8 - 1);
  527.          var1.setColor(var3);
  528.          this.loadIcons();
  529.          Icon var10 = this.fImage == null ? sMissingImageIcon : sPendingImageIcon;
  530.          if (var10 != null) {
  531.             var10.paintIcon(((View)this).getContainer(), var1, var5, var6);
  532.          }
  533.       }
  534.  
  535.       if (this.fImage != null) {
  536.          var1.drawImage(this.fImage, var5, var6, var7, var8, this);
  537.       }
  538.  
  539.       Color var12 = this.getBorderColor();
  540.       if (var9 == 2) {
  541.          int var11 = 2 - var4;
  542.          if (var11 > 0) {
  543.             var5 += var11;
  544.             var6 += var11;
  545.             var7 -= var11 << 1;
  546.             var8 -= var11 << 1;
  547.             var4 = 2;
  548.          }
  549.  
  550.          var12 = null;
  551.          var1.setColor(Color.black);
  552.          var1.fillRect(var5 + var7 - 5, var6 + var8 - 5, 5, 5);
  553.       }
  554.  
  555.       if (var4 > 0) {
  556.          if (var12 != null) {
  557.             var1.setColor(var12);
  558.          }
  559.  
  560.          for(int var13 = 1; var13 <= var4; ++var13) {
  561.             var1.drawRect(var5 - var13, var6 - var13, var7 - 1 + var13 + var13, var8 - 1 + var13 + var13);
  562.          }
  563.  
  564.          var1.setColor(var3);
  565.       }
  566.  
  567.    }
  568.  
  569.    protected void repaint(long var1) {
  570.       if (this.fContainer != null && this.fBounds != null) {
  571.          this.fContainer.repaint(var1, this.fBounds.x, this.fBounds.y, this.fBounds.width, this.fBounds.height);
  572.       }
  573.  
  574.    }
  575.  
  576.    protected void resize(int var1, int var2) {
  577.       if (var1 != this.fWidth || var2 != this.fHeight) {
  578.          this.fWidth = var1;
  579.          this.fHeight = var2;
  580.          SimpleAttributeSet var3 = new SimpleAttributeSet();
  581.          var3.addAttribute(Attribute.WIDTH, Integer.toString(var1));
  582.          var3.addAttribute(Attribute.HEIGHT, Integer.toString(var2));
  583.          ((StyledDocument)((View)this).getDocument()).setCharacterAttributes(this.fElement.getStartOffset(), this.fElement.getEndOffset(), var3, false);
  584.       }
  585.    }
  586.  
  587.    public void setParent(View var1) {
  588.       super.setParent(var1);
  589.       this.fContainer = var1 != null ? ((View)this).getContainer() : null;
  590.       if (var1 == null && this.fComponent != null) {
  591.          this.fComponent.getParent().remove(this.fComponent);
  592.          this.fComponent = null;
  593.       }
  594.  
  595.    }
  596.  
  597.    public void setSize(float var1, float var2) {
  598.    }
  599.  
  600.    public int viewToModel(float var1, float var2, Shape var3, Position.Bias[] var4) {
  601.       Rectangle var5 = (Rectangle)var3;
  602.       if (var1 < (float)(var5.x + var5.width)) {
  603.          var4[0] = Bias.Forward;
  604.          return ((View)this).getStartOffset();
  605.       } else {
  606.          var4[0] = Bias.Backward;
  607.          return ((View)this).getEndOffset();
  608.       }
  609.    }
  610. }
  611.